/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import entities.ComprasCabecera;
import entities.ComprasCabeceraPK;
import entities.ComprasDetalle;
import entities.ComprasDetallePK;
import entities.EntradaSalidaArticulos;
import entities.VentasCabecera;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceException;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;

/**
 *
 * @author edgar
 */
@ManagedBean(name = "comprasController")
@SessionScoped
public class ComprasController {

    private ComprasCabecera comprasCabecera = new ComprasCabecera();
    private ComprasCabeceraPK comprasCabeceraPK = new ComprasCabeceraPK();
    private DetalleCompra detalleCompra = new DetalleCompra();
    private List<DetalleCompra> listaDetalle = new ArrayList();

    public void agregarDetalleCompra() {
        if (this.getListaDetalle().isEmpty()) {
            this.detalleCompra.setNroLinea(1);
        } else {
            this.detalleCompra.setNroLinea(this.getListaDetalle().size() + 1);
        }
        DetalleCompra dv = new DetalleCompra();
        dv.setNroLinea(this.getDetalleCompra().getNroLinea());
        dv.setArticulo(this.getDetalleCompra().getArticulo());
        dv.setCantidad(this.getDetalleCompra().getCantidad());
        dv.setCosto(this.getDetalleCompra().getCosto());
        this.getListaDetalle().add(dv);
        this.getDetalleCompra().setNroLinea(this.getDetalleCompra().getNroLinea() + 1);
    }

    public List<ComprasDetalle> cargarDetalleCompra(ComprasCabecera vc) {
        ComprasDetalle vd = null;
        List<ComprasDetalle> listaVD = new ArrayList();
        for (int i = 0; i < this.getListaDetalle().size(); i++) {
            ComprasDetallePK vdpk = new ComprasDetallePK();
            vdpk.setNroFactura(vc.getComprasCabeceraPK().getNroFactura());
            vdpk.setNroLinea(this.getListaDetalle().get(i).getNroLinea());
            vdpk.setCodProveedor(vc.getComprasCabeceraPK().getCodProveedor());
            vd = new ComprasDetalle();
            vd.setComprasDetallePK(vdpk);
            vd.setComprasCabecera(vc);
            vd.setCodArticulo(this.getListaDetalle().get(i).getArticulo());
            vd.setCantidad(this.getListaDetalle().get(i).getCantidad());
            vd.setCosto(this.getListaDetalle().get(i).getCosto());
            listaVD.add(vd);
        }
        return listaVD;
    }

    public void reset() {
        this.comprasCabecera = new ComprasCabecera();
        this.detalleCompra = new DetalleCompra();
        this.comprasCabeceraPK = new ComprasCabeceraPK();
        this.listaDetalle.clear();
    }

    public void guardarEntradaSalida(ComprasDetalle ve) {
        EntradaSalidaArticulos esa = new EntradaSalidaArticulos();
        esa.setCantidad(ve.getCantidad());
        esa.setCodArticulo(ve.getCodArticulo());
        esa.setFecha(ve.getComprasCabecera().getFecha());
        esa.setNroDocumento(ve.getComprasCabecera().getComprasCabeceraPK().getNroFactura());
        esa.setObservaciones("Entrada de artículos según Factura de compra Nro:" + ve.getComprasCabecera().getComprasCabeceraPK().getNroFactura() + " Proveedor: " + ve.getComprasCabecera().getComprasCabeceraPK().getCodProveedor() + " - " + ve.getComprasCabecera().getProveedores().getDescripcion());
        esa.setTipoMovimiento("E");
        em.persist(esa);
    }

    public String insertar() {
        UserTransaction t;
        try {
            t = (UserTransaction) new InitialContext().lookup("java:comp/UserTransaction");
            t.begin();
            this.comprasCabeceraPK.setCodProveedor(this.comprasCabecera.getProveedores().getCodProveedor());
            this.comprasCabecera.setComprasCabeceraPK(comprasCabeceraPK);
            em.persist(this.comprasCabecera);
            List<ComprasDetalle> lista = this.cargarDetalleCompra(this.comprasCabecera);
            Integer montoFactura = 0;
            for (int i = 0; i < lista.size(); i++) {
                ComprasDetalle vd = lista.get(i);
                em.persist(vd);
                //if (this.ventasCabecera.getConfirmada()) {
                this.guardarEntradaSalida(vd);
                new ArticulosController().actualizarSaldoYCostoEnCompras(vd.getCodArticulo(), vd.getCosto(), vd.getCantidad(), em);
                //}
                montoFactura = montoFactura + (vd.getCosto() * vd.getCantidad().intValue());
            }
            // if (this.ventasCabecera.getConfirmada()) {
            /////////////////     new CuotasACobrarController().insertar(ventasCabecera, montoFactura, em);
            // }
            t.commit();
            this.reset();
        } catch (PersistenceException ex) {
            //t.rollback();
            ex.printStackTrace();
        } catch (NamingException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NotSupportedException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SystemException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RollbackException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (HeuristicMixedException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (HeuristicRollbackException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SecurityException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalStateException ex) {
            Logger.getLogger(VentasController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "";
    }

    /**
     * @return the comprasCabecera
     */
    public ComprasCabecera getComprasCabecera() {
        return comprasCabecera;
    }

    /**
     * @param comprasCabecera the comprasCabecera to set
     */
    public void setComprasCabecera(ComprasCabecera comprasCabecera) {
        this.comprasCabecera = comprasCabecera;
    }
    @PersistenceContext(unitName = "sgal3PU")
    EntityManager em;

    /**
     * @return the detalleCompra
     */
    public DetalleCompra getDetalleCompra() {
        return detalleCompra;
    }

    /**
     * @param detalleCompra the detalleCompra to set
     */
    public void setDetalleCompra(DetalleCompra detalleCompra) {
        this.detalleCompra = detalleCompra;
    }

    /**
     * @return the listaDetalle
     */
    public List<DetalleCompra> getListaDetalle() {
        return listaDetalle;
    }

    /**
     * @param listaDetalle the listaDetalle to set
     */
    public void setListaDetalle(List<DetalleCompra> listaDetalle) {
        this.listaDetalle = listaDetalle;
    }

    /**
     * @return the comprasCabeceraPK
     */
    public ComprasCabeceraPK getComprasCabeceraPK() {
        return comprasCabeceraPK;
    }

    /**
     * @param comprasCabeceraPK the comprasCabeceraPK to set
     */
    public void setComprasCabeceraPK(ComprasCabeceraPK comprasCabeceraPK) {
        this.comprasCabeceraPK = comprasCabeceraPK;
    }
}
